home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / diskutil / serial.zoo / serial.pas < prev   
Pascal/Delphi Source File  |  1990-08-15  |  5KB  |  160 lines

  1. program serial;
  2.  
  3. uses crt,dos;
  4.  
  5. VAR
  6.    bad_dev : boolean;
  7.    drv,inp : char;
  8.    regs    : registers;
  9.    bios_id : byte;
  10.    boot    : array[0..511] of byte;
  11.    bios_err: boolean;
  12.    err_count : byte;
  13.    old_ser   : longint;
  14.  
  15.  
  16. procedure dreset;
  17. {resets the drive in the regs record, saves the relevant parameters...}
  18. var temp:word;
  19.  
  20. begin
  21.      temp:=regs.ax;
  22.      regs.ax:=0;        {reset function}
  23.      intr(19,regs);
  24.      regs.ax:=temp;
  25. end;
  26.  
  27.  
  28.  
  29. procedure rw_boot(fn:byte);
  30. {reads/writes the bootsector...}
  31.  
  32. begin
  33.      bios_id:=ord(drv)-ord('A');
  34.      bios_err:=true;
  35.      repeat
  36.            err_count:=0;
  37.            while (err_count<10) and bios_err  do
  38.            begin
  39.                   {Now lets set up some registers...}
  40.                 regs.ah:=fn;            {read/write}
  41.                 regs.es:=seg(boot);     {Segment of storage}
  42.                 regs.bx:=ofs(boot);     {Offset of storage}
  43.                 regs.dl:=bios_id;       {Drive ID}
  44.                 regs.dh:=0;             {side 0}
  45.                 regs.ch:=0;             {track 0}
  46.                 regs.cl:=1;             {fisrt sector.. STUPID!}
  47.                 regs.al:=1;             {read 1 sector}
  48.                 intr(19,regs);        {Call BIOS}
  49.                 if (regs.flags and Fcarry)=1 then
  50.                 begin
  51.                    err_count:=err_count+1;
  52.                    dreset;
  53.                    delay(100)            {hang on a bit}
  54.                 end
  55.                 else bios_err:=false {it worked}
  56.            end;
  57.            if bios_err then
  58.            begin
  59.                 Writeln;
  60.                 writeln('BIOS error. Hit <R> to retry, or <CR> to exit');
  61.                 repeat
  62.                       inp:=upcase(readkey)
  63.                 until (inp='R') or (inp=chr(13));
  64.                 if inp=chr(13) then halt(0)
  65.            end;
  66.      until not(bios_err)
  67. end;
  68.  
  69. procedure WriteHexDigit(d: integer);
  70.  
  71. begin
  72.   if d < 10 then begin
  73.     Write(d)
  74.   end
  75.   else begin
  76.     Write(Chr(d - 10 + Ord('A')))
  77.   end
  78. end;
  79.  
  80.  
  81.  
  82.  
  83.  
  84.  
  85. procedure doit;
  86.  
  87. begin
  88.      Writeln;
  89.      writeln('Enter the drive identifier for the disk to be initialised, or <CR> to exit.');
  90.      write(' -> ');
  91.      bad_dev:=true;
  92.      drv:=' ';
  93.      while bad_dev do
  94.      begin
  95.           repeat
  96.                 drv:=upcase(readkey);
  97.                 if drv=chr(13) then halt(0);
  98.           until (drv>='A') and (drv<='Z');
  99.           writeln(drv);
  100.             {Now call IOCTL() to suss out the drive...}
  101.           regs.ah:=68;        {ioctl}
  102.           regs.al:=8;         {subfunction 8, is device removable?}
  103.                               {This seems a reasonable test for floppy...}
  104.                               {It will certainly save grief on HD's}
  105.           regs.bl:=1+ord(drv)-ord('A');
  106.                               {And a device number...}
  107.           msdos(regs);
  108.           case regs.ax of
  109.                0 : bad_dev:=false;
  110.                                   {Ok, it's removable}
  111.                1 : begin
  112.                         write('Device ',drv,': is non-removable.');
  113.                                    {Obviously not}
  114.                         write(' -> ');
  115.                    end;
  116.                15 : begin
  117.                          writeln('Device ',drv,': does not exist.');
  118.                          write(' -> ');
  119.                                    {Invalid drive}
  120.                      end;
  121.           end;
  122.      end;
  123.      writeln('Reading bootsector from device ',drv,':');
  124.      rw_boot(2);         {Read the bootsector}
  125.      write('Serial was :');
  126.      writehexdigit(boot[8] div 16);
  127.      writehexdigit(boot[8] mod 16);
  128.      writehexdigit(boot[9] div 16);
  129.      writehexdigit(boot[9] mod 16);
  130.      writehexdigit(boot[10] div 16);
  131.      writehexdigit(boot[10] mod 16);
  132.      writeln;
  133.      writeln('Bootsector read, modifying...');
  134.      randomize;
  135.      boot[8]:=random(255);
  136.      boot[9]:=random(255);
  137.      boot[10]:=random(255);
  138.      writeln('Writing bootsector to device ',drv,':');
  139.      rw_boot(3);         {Write the bootsector}
  140.      write('Serial is  :');
  141.      writehexdigit(boot[8] div 16);
  142.      writehexdigit(boot[8] mod 16);
  143.      writehexdigit(boot[9] div 16);
  144.      writehexdigit(boot[9] mod 16);
  145.      writehexdigit(boot[10] div 16);
  146.      writehexdigit(boot[10] mod 16);
  147.      writeln;
  148. end;
  149.  
  150.  
  151.  
  152. begin  {main}
  153.        writeln;
  154.        writeln(' Atari ST disk serialiser for MS-DOS.');
  155.        writeln(' (C) and freeware, 1990 by Michael Smith.');
  156.        writeln(' ma892224@lux.sait.edu.au.');
  157.        repeat
  158.              doit;
  159.        until false;
  160. end.ə